/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xos_net.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_objs/head.h"
#include "../config/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "../msg/head.h"
#include "notify_udp.h"
#include "msg_notify.h"

namespace xos_net
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    notify_udp::notify_udp()
    {
    }

    notify_udp::~notify_udp()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    // 
    // proc
    // 
    int notify_udp::proc( xos_box::i_msg*& pMsg )
    {
        int ret = 1;

        int nMsg = pMsg->get_msg();

        switch( nMsg )
        {
            case net::NET_UDP_INIT_SERVER:
            {
                init_server( pMsg );
            }
            break;
            case net::NET_UDP_SEND:
            {
                send( pMsg );
            }
            break;
            case net::NET_UDP_SHUTDOWN:
            {
                shutdown( pMsg );
            }
            break;
            case net::NET_UDP_CLOSE:
            {
                close( pMsg );
            }
            break;

            default:
            {
                ret = 0;
            }
            break;
        }

        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    // bool[0]      : if success
    // 
    // msg[0]       : msg type
    // 
    // str[1]       : local ip
    // int[1]       : local port
    // 
    // str[2]       : peer ip
    // int[2]       : peer port
    // 
    // void[0]      : xos_net::connection*
    // void[1]      : user data
    // 
    int notify_udp::init_server( xos_box::i_msg*& pMsg )
    {
        int ret = 0;

        void* pUserData = pMsg->get_void( 1, 0 );
        connection* pCon = 0;
        {
            const char* lpszIp = pMsg->get_str( 1, 0, 0, 0 );
            int nPort = pMsg->get_int( 1, 0 );
            udp::T* pT = 0;
            udp::init( pT, pCon );
            pT->m_nLocalPort = nPort;
            pT->m_local_ip = lpszIp;
            pCon->set_udp();
        }
        msg_notify::helper_init_notify( pMsg, pCon );
        pCon->set_user_data( pUserData );
        pCon->add_ref();
        pCon->post_init( pMsg );

        return ret;
    }

    // bool[0]      : if success
    // 
    // bool[1]      : close after send
    // bool[2]      : quit after send
    // 
    // msg[0]       : msg type
    // 
    // str[2]       : peer ip
    // int[2]       : peer port
    // 
    // int[0]       : send bytes
    // buf[0]       : send buf
    // 
    // void[0]      : xos_net::connection*
    // 
    int notify_udp::send( xos_box::i_msg*& pMsg )
    {
        int ret = 0;

        connection * pCon = (connection *)(net::i_connect *)pMsg->get_void( 0, 0 );
        xos_box::i_buf* pBuf = pMsg->get_buf( 0, 0 );

        bool bCloseAfterSend = pMsg->get_bool( 1, 0 );
        bool bQuitAfterSend = pMsg->get_bool( 2, 0 );

        const char * lpszIp = pMsg->get_str( 2, 0, 0, 0 );
        int nPort = pMsg->get_int( 2, 0 );

        pCon->post_send( pMsg, lpszIp, nPort, pBuf, bCloseAfterSend, bQuitAfterSend );

        return ret;
    }

    // bool[0]      : if success
    // 
    // msg[0]       : msg type
    // 
    // int[0]       : how
    // 
    // void[0]      : xos_net::connection*
    // 
    int notify_udp::shutdown( xos_box::i_msg*& pMsg )
    {
        int ret = 0;

        connection * pCon = (connection *)(net::i_connect *)pMsg->get_void( 0, 0 );
        int how = pMsg->get_int( 0, 0 );
        pCon->post_shutdown( pMsg, how );

        return ret;
    }

    // bool[0]      : if success
    // 
    // msg[0]       : msg type
    // 
    // void[0]      : xos_net::connection*
    // 
    int notify_udp::close( xos_box::i_msg*& pMsg )
    {
        int ret = 0;

        connection * pCon = (connection *)(net::i_connect *)pMsg->get_void( 0, 0 );
        pCon->post_close( pMsg, true );

        return ret;
    }

} // xos_net
